from django.shortcuts import render

# Create your views here.

# 判断用户名是否存在
from rest_framework import status
from rest_framework.mixins import CreateModelMixin

from users.utils import check_verify_email_token

"""
当光标移开时，前端会发送一个ａｊａｘ请求，把用户注册时输入的用户名传过来

请求方式： GET /users/usernames/(?P<username>\w{5,20})/count/

１　接收参数
２　判断用户名是否注册过
３　返回响应
"""
from users.models import User
from rest_framework.views import APIView
from rest_framework.response import Response


class RegisterUsernameView(APIView):
    def get(self, request, username):
        # 1.接收参数
        # 2.判断用户名是否注册(存在)
        # 查询用户名,根据返回的 count 来判断
        # count = 0 表示没有注册
        # count = 1 表示注册过

        count = User.objects.filter(username=username).count()
        # 3.返回响应
        return Response({'count': count, 'username': username})


# 注册
"""
前端需要把　username, password, password2,sms_code ,mobile, allow这六个参数传递到后端接口
１　接收参数
２　校验参数
３　数据入库
４　返回响应
"""
from users.serializers import RegisterCreateUserSerializer, UserConterInfoSerializer, AddressSerializer


class RegisterCreateUserView(APIView):
    def post(self, request):
        # 1 获取参数
        data = request.data
        # 校验参数
        serializer = RegisterCreateUserSerializer(data=data)
        # 数据入库
        serializer.is_valid(raise_exception=True)
        serializer.save()
        # 返回响应

        # serializer.data就是进行序列化的的操作，
        # 序列化操作的实际步骤就是　先根据序列化器中的字段，
        # 然后去实例化模型对象中找对应的值，然后转化为json格式的数据
        return Response(serializer.data)
        # return Response({"MESS":"ok"})

    """
    当用户注册完成后让用户自动登录，
    所以当用户注册完成后就自动返回一个ｔｏｋｅｎ
    和用户信息
    """


"""
这个接口只能登录用户访问　　，前端通过在请求头heard中添加jwt token

1   获取登录用户的信息，　user
2   创建序列化器，转化数据格式
３   返回响应

请求路径　ＧＥＴ　user/info/
"""
from rest_framework.permissions import IsAuthenticated

# class UserConterInfo(APIView):
#     # 1　这个接口只能登录用户访问，利用django框架中自带的校验机制
#     permission_classes = [IsAuthenticated]
#
#     def get(self, request):
#         # 获取用户信息
#         user = request.user
#
#         # 序列化器
#         serizlizer = UserConterInfoSerializer(user)
#
#         # 返回数据
#         return Response(serizlizer.data)

from rest_framework.generics import RetrieveAPIView, CreateAPIView


class UserConterInfo(RetrieveAPIView):
    serializer_class = UserConterInfoSerializer
    queryset = User.objects.all()

    #     # 1　这个接口只能登录用户访问，利用django框架中自带的校验机制
    permission_classes = [IsAuthenticated]

    def get_object(self):
        return self.request.user


"""
保存并验证邮箱接口保存邮箱并发送验证邮件

请求方式：PUT/users/emails/
"""

from rest_framework.permissions import IsAuthenticated
from rest_framework.generics import UpdateAPIView
from .serializers import EmailSerializer


class EmailView(UpdateAPIView):
    """
    保存邮箱
    PUT /users/emails/
    """
    # 只允许登录用户登录
    permission_classes = [IsAuthenticated]
    # 指定序列化器
    serializer_class = EmailSerializer

    # 重写get_object方法，获取　user信息
    def get_object(self):
        return self.request.user



"""
请求方式GET /users/emails/verification/
前端把用于验证的token发送给后端接口，
由后端接口判断token的有效性，如果token有效，则修改邮箱的验证状态，
并将处理结果返回给前端展示给用户。

"""
class VerificationEmailView(APIView):


    def get(self,request):

        # 1 接收ｔｏｋｅｎ
        token = request.query_params.get('token')
        # 2 校验token
        user_id = check_verify_email_token(token)
        if not user_id:
            return Response({'message':'链接无效'},status=status.HTTP_400_BAD_REQUEST)

        # 3 查询用户信息
        try:
            user = User.objects.get(id = user_id)
        except User.DoesNotExist:
            return Response({'message': '链接无效'}, status=status.HTTP_400_BAD_REQUEST)
        # 4 修改并保存

        user.email_active = True
        user.save()
        # 5 返回响应
        return Response({'message': 'ok'})


"""保存用户收获信息时，需要前端把用用户上输入的信息在点击保存的时候，发送一个ａｊａｘ请求，
传到后端,后端接收后保存数据，因为用户登录了以后，浏览器存放的用户信息是　jwt形式的　token

１　接收参数
２　序列化器序列化
３　校验＋保存
４　返回响应
/users/addresses/
"""

class AddressView(CreateAPIView):
    serializer_class = AddressSerializer

